/*lic*/
#ifndef __I2C_INIT_HELPER_H__
#define __I2C_INIT_HELPER_H__

#include "main.h"

//I2C结构体
/**
 * @brief I2c communication mode enum
 */
typedef enum {
  GET = 0U,
  POST = 1U,
} Transport_Type_Def;
typedef enum {
  REQUEST = 0U,
  RESPONSE = 1U,
} Transport_Methon_Def;

typedef struct __Tag_I2c_Data_Task_Def {
  char name[16];
  CM_I2C_TypeDef * i2c_cm;
  uint16_t send_data_len;                      /*!< I2C 发送长度*/
  uint16_t receive_data_len;                   /*!< I2C 接收长度*/
  uint16_t send_translate_index;               /*!< I2C 发送数据指针索引*/
  uint16_t receive_translate_index;            /*!< I2C 接收数据指针索引*/\
  Transport_Type_Def transport_mode;
	bool has_address;
  Transport_Methon_Def package_transport_mode;
  struct rt_mutex port_lock;                 /*!< I2C 端口状态，忙碌还是空闲*/
  uint8_t data_buf[64];                        /*!< I2C 数据缓冲区*/
  struct rt_semaphore i2c_sem;                 /* 发送中断信号 */
} I2c_Data_Task_Def;
//I2C结构体

/*= 外部RTC中断 =*/

/* I2C 事件及错误中断 */
void INT_SRC_I2Cx_EEI_IrqCallback(CM_I2C_TypeDef * CM_I2Cx, I2c_Data_Task_Def* i2c_ctrl_obj);
/* I2Cx 数据发送完成1字节中断 */
void INT_SRC_I2Cx_TXI_IrqCallback(CM_I2C_TypeDef * CM_I2Cx, I2c_Data_Task_Def* i2c_ctrl_obj);
/* I2Cx 数据接收完成1字节中断 */
void INT_SRC_I2Cx_RXI_IrqCallback(CM_I2C_TypeDef * CM_I2Cx, I2c_Data_Task_Def* i2c_ctrl_obj);
/* 发送停止条件中断 */
void INT_SRC_I2Cx_TEI_IrqCallback(CM_I2C_TypeDef * CM_I2Cx, I2c_Data_Task_Def* i2c_ctrl_obj);

/**
 * @brief  发送开始信号，触发开始信号事件
* 这里不处理收发逻辑。不同I2C的启动信号需要独立触发
 * @param  None
 * @retval None
 */
void Master_Start(CM_I2C_TypeDef *CM_I2Cx);
/**
 * @brief  主机使用中断发送数据
 * 通用发送函数，需要传入发送信息
 * @retval int32_t:
 *            - LL_OK:           Success
 *            - LL_ERR_BUSY:     Busy
 */
int32_t I2C_Master_Transmit_IT(CM_I2C_TypeDef *CM_I2Cx, I2c_Data_Task_Def *ctrl_obj);
/**
 * @brief  主机使用中断接收数据
 * 通用接收函数，需要传入发送信息
 * @retval int32_t:
 *            - LL_OK:           Success
 *            - LL_ERR_BUSY:     Busy
 */
int32_t I2C_Master_Receive_IT(CM_I2C_TypeDef *CM_I2Cx, I2c_Data_Task_Def *ctrl_obj);
// 一次收发数据,现在就用这个函数
int32_t I2C_Master_Translate_IT(CM_I2C_TypeDef *CM_I2Cx, I2c_Data_Task_Def *ctrl_obj, uint16_t addr);


int32_t I2C_Master_Transmit_Poll(CM_I2C_TypeDef *CM_I2C, uint16_t u16DevAddr, uint8_t const au8Data[], uint32_t u32Size, uint32_t u32Timeout);
int32_t I2C_Master_Receive_Poll(CM_I2C_TypeDef *CM_I2C, uint16_t u16DevAddr, uint8_t au8Data[], uint32_t u32Size, uint32_t u32Timeout);

//I2Cx Config
void App_I2CxCfg(void);

// 初始化I2c_Data_Task_Def
rt_err_t Init_I2c_Data_Task_Obj(I2c_Data_Task_Def* obj, char* name, CM_I2C_TypeDef *CM_I2C);

#endif /* __I2C_INIT_HELPER_H__ */

/*eof*/
